#!/usr/bin/python
"""
Gera as tabelas de consulta para o etiquetador AG.
"""
import re

mapa_palavra_etiquetas  = {}
mapa_contextual = {}
mapa_tabela_etiquetas = {}

def acrescentarPalavra(l, pa, et):
    d = {}
    if pa not in l:
        d = {et:1}
    else:
        d = l[pa]
        if et not in d:
            d[et] = 1
        else:
            d[et] = d[et] + 1
    l[pa] = d

# Lineariza as frequencias de palavras encontradas.
def linearizarOccorenciasDePalavras(mpe):
    for palavra in mpe:
        le = []
        mapa = mpe[palavra]
        total = 0
        for et in mapa:
            total = total + mapa[et]
            le.append((mapa[et], et))
    #le.sort()
        #i = 1
        d = {}
        # Rejeitando etiquetas com frequencia abaixo de 5%.
        for seq in le:
            if seq[0]/total >= 0.05:
                d[seq[1]] = seq[0]
            #d[seq[1]] = i
            #i = i * 2
            #i = i + 1
        mpe[palavra] = d
        
def acrescentarContexto(t, co):
    ch = co
    if ch not in t:
        t[ch] = 1
    else:
        t[ch] = t[ch] + 1

TE = 1
TD = 1

# Qtd de tags a serem consideradas para treino
limite_de_corte = -1

er_extrator = re.compile(r"(.+)\_(.+)")
er_pontuacao = re.compile(r"(?P<sinal>[.!?]|[.]{3})\_(?P=sinal)")

if 1:
    f = open("corpus/seletos.txt.utf8","r",encoding="utf-8")
    corpus = f.readlines()
    f.close()

    texto_fraseadas = open("tabelas/texto_fraseadas_com_etiquetas.txt","w",encoding="utf-8")
    texto_fraseadas_sem_etiquetas = open("tabelas/texto_fraseadas_sem_etiquetas.txt","w",encoding="utf-8")


    P = 0
    Compr = len(corpus)

    while P < Compr:
        Fim = P
#        while (Fim < Compr) and (corpus[Fim] != "._.\n"):
        while (Fim < Compr) and not (er_pontuacao.match(corpus[Fim])):
            Fim = Fim + 1

        for pos_palavra_etiqueta in range(P, Fim):
            palavra_lida = corpus[pos_palavra_etiqueta].rstrip("+|\n")
            if palavra_lida != "_NPROP":
                if len(palavra_lida) > 3:
                    palavra_lida = palavra_lida.rstrip("|[]")
                texto_fraseadas.write(palavra_lida + " ")
                exame = er_extrator.match(palavra_lida)
                texto_fraseadas_sem_etiquetas.write((exame.group(1)) + " ")
                #    texto_fraseadas_sem_etiquetas.write((er_extrator.match(corpus[pos_palavra_etiqueta]).group(1)).rstrip() + " ")

        if Fim < Compr:
            #texto_fraseadas.write("._.\n")
            texto_fraseadas.write(corpus[Fim])
            
            #texto_fraseadas_sem_etiquetas.write(".\n")
            texto_fraseadas_sem_etiquetas.write(er_extrator.match(corpus[Fim]).group(1) + "\n")
        else:
            break
        P = Fim + 1
        
    texto_fraseadas.close()
    texto_fraseadas_sem_etiquetas.close()

f2 = open("tabelas/texto_fraseadas_com_etiquetas.txt","r",encoding="utf-8")
for linha in f2:
    lista_palavra_etiquetada = linha.split()
    p = 0
    for palavra_etiquetada in lista_palavra_etiquetada:
        ce = ["NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL"]
        cc = ""
        cd = ["NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL"]
        
        i = 1
        while i <= TE:
            if p - i >= 0:
                casa = er_extrator.match(lista_palavra_etiquetada[p - i])
                palavra = casa.group(1); etiqueta = casa.group(2).rstrip("+|")
                ce[len(ce) - i] = etiqueta
                acrescentarPalavra(mapa_palavra_etiquetas, palavra, etiqueta)
            i = i + 1
        
        strce = ""
        i = 1
        while i <= TE:
            strce = ce[len(ce) - i] + " " + strce
            i = i + 1

        casa = er_extrator.match(palavra_etiquetada)
        palavra = casa.group(1);
        etiqueta = casa.group(2).rstrip("+|")                
        cc = etiqueta
        acrescentarPalavra(mapa_palavra_etiquetas, palavra, etiqueta)
        
        i = 1
        while i <= TD:
            if p + i < len(lista_palavra_etiquetada):
                casa = er_extrator.match(lista_palavra_etiquetada[p + i])
                if not casa:
                    print("-->" + lista_palavra_etiquetada[p + i])
                palavra = casa.group(1); etiqueta = casa.group(2).rstrip("+|")                
                cd[i - 1] = etiqueta
                acrescentarPalavra(mapa_palavra_etiquetas, palavra, etiqueta)
            i = i + 1
        
        strcd = ""
        i = 1
        while i <= TD:
            strcd = strcd  + " " +  cd[i - 1]
            i = i + 1

        acrescentarContexto(mapa_contextual, strce + cc + strcd)
        acrescentarContexto(mapa_tabela_etiquetas, cc)

        p = p + 1
        
        limite_de_corte = limite_de_corte - 1
        if limite_de_corte == 0:
            break;

    if limite_de_corte == 0:
        break;
            
f2.close()

linearizarOccorenciasDePalavras(mapa_palavra_etiquetas)
g = open("tabelas/etiquetas_palavra.txt","w",encoding="utf-8")
for pal in mapa_palavra_etiquetas:
    g.write(pal)
    dic = mapa_palavra_etiquetas[pal]
    for etp in dic:
        g.write(" " + etp + " " + str(dic[etp]))
    g.write("\n")
g.close()

#h = open("tabelas/treino_" + str(TE) + '_' + str(TD) + ".txt","w",encoding="utf-8")
h = open("tabelas/tabela_referencia.txt","w",encoding="utf-8")
h.write(str(TE) + ' ' + str(TD) + " " + str(len(mapa_contextual)) + '\n')
for c in mapa_contextual:
    h.write(c + " " + str(mapa_contextual[c]) + '\n')
h.close()

m = open("tabelas/extracao_etiquetas.txt","w",encoding="utf-8")
m.write('NULL 0\n')
for x in mapa_tabela_etiquetas:
    m.write(x + " " + str(mapa_tabela_etiquetas[x]) + '\n')
m.close()
